题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。
示例 1:
1 | 输入: "the sky is blue" |
示例 2:
1 | 输入: " hello world! " |
示例 3:
1 | 输入: "a good example" |
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
注意: 本题与主站 151 题相同:https://leetcode-cn.com/problems/reverse-words-in-a-string/
注意: 此题对比原题有改动
算法
(字符串翻转) $O(n)$
- 使用双指针算法先翻转每个单词
- 然后翻转整个字符串
但在字符串的开头、中间、结尾都可能会有空格,我们需要把这三部分多余的空格去掉,只保留每个单词之间的空格。而且题目要求使用 $O(1)$ 的空间完成,所以只能复用字符串,用一个指针 $k$ 从前往后存储有效的字符部分,翻转结束后 $k$ 后面多余的字符都删掉。
$[i, j]$ 单词部分放到 $[k, t]$ 位置上
时间复杂度
整个字符串需要被扫描两遍,所以时间复杂度为 $O(n)$
空间复杂度
$O(1)$
代码
1 | class Solution { |